# -*- coding: utf-8 -*-

"""剑指 Offer II 099. 最小路径之和
给定一个包含非负整数的 m x n 网格 grid ，请找出一条从左上角到右下角的路径，使得路径上的数字总和为最小。
说明：一个机器人每次只能向下或者向右移动一步。

示例 1：
输入：grid = [[1,3,1],[1,5,1],[4,2,1]]
输出：7
解释：因为路径 1→3→1→1→1 的总和最小。

示例 2：
输入：grid = [[1,2,3],[4,5,6]]
输出：12

提示：
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100"""

class Solution:
    """动态规划+哨兵
    f(i,j) = min(f(i-1,j),f(i,j-1))+g[i][j]"""
    def minPathSum(self, grid) -> int:
        grid.insert(0, [101 for _ in grid[0]])
        for row in grid:
            row.insert(0, 101)
        dp = [[float('inf') for _ in row]for row in grid]
        for i in range(1, len(grid)):
            row = grid[i]
            for j in range(1, len(row)):
                if i == 1 and j == 1:
                    dp[i][j] = grid[i][j]
                else:
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j]
        
        # for row in dp:
        #     for col in row:
        #         print(col, end=',')
        #     print('')

        return dp[i][j]


if __name__ == '__main__':
    so = Solution()
    print(so.minPathSum(grid = [[1,3,1],[1,5,1],[4,2,1]]))
    print(so.minPathSum(grid = [[1,2,3],[4,5,6]]))
